package gttp.nspa.shared.om;

public interface IOrder {

    public static enum Status {
        /**
         * Khách đã order và chờ phục vụ
         */
        ORDERING,

        /**
         * Khách hủy order (chỉ được hủy khi chưa được phục vụ)
         */
        CANCELLED,

        /**
         * Khách đang được phục vụ order
         */
        SERVING,

        /**
         * Khách đã được phục vụ xong
         */
        SERVED;
    }

    Long getId();

    /**
     * @return Thời gian bắt đầu 1 order
     */
    long getTime();

    /**
     * @return Thời gian kết thúc 1 order
     */
    Long getTimeEnd();

    /**
     * @return Code sản phẩm được order
     */
    String getProduct();

    /**
     * @return Số tiền phải thu của order
     */
    int getIncome();

    /**
     * @return Trạng thái của order. Tùy thuộc trạng thái mà có thể thực hiện được các hành động tương ứng
     */
    Status getStatus();

    /**
     * @return Lý do hủy order
     */
    String getReason();

    /**
     * Hủy order. Chỉ khi đang ở trạng thái ORDERING thì mới cancel được<br>
     * Sau khi thực hiện thành công, order chuyển về trạng thái CANCCELLED
     * @param reason
     *        Lý do hủy order
     * @return TRUE nếu cancel thành công
     */
    boolean cancel(String reason);

    /**
     * Phục vụ order. Chỉ khi đang ở trạng thái ORDERING mới serve được<br>
     * Sau khi thực hiện thành công, order chuyển về trạng thái SERVING
     * @return TRUE nếu serve thành công
     */
    boolean serve();

    /**
     * Phục vụ order xong. Chỉ khi đang ở trạng thái ORDERING hay SERVING mới thực hiện được<br>
     * Sau khi thực hiện thành công, order chuyển về trạng thái SERVED
     * @return TRUE nếu thực hiện thành công
     */
    boolean serveDone();
}
